package hubur

import (
	"fmt"
	"strings"
)

var suffix = []string{
	"ac", "ac.cn", "accountant", "ad",
	"ae",
	"aero",
	"af",
	"ag",
	"ah.cn",
	"ai",
	"al",
	"am",
	"an",
	"ao",
	"aq",
	"ar",
	"arpa",
	"as",
	"asia",
	"asia.pw",
	"at",
	"au",
	"auction",
	"audio",
	"aw",
	"ax",
	"az",
	"ba",
	"band",
	"bar",
	"bb",
	"bd",
	"be",
	"best",
	"bf",
	"bg",
	"bh",
	"bi",
	"bid",
	"bike",
	"biz",
	"bj",
	"bj.cn",
	"black",
	"blue",
	"bm",
	"bn",
	"bo",
	"br",
	"bs",
	"bt",
	"bv",
	"bw",
	"by",
	"bz",
	"ca",
	"cab",
	"cafe",
	"camera",
	"cards",
	"cash",
	"cat",
	"cc",
	"cc.net",
	"cd",
	"center",
	"ceo",
	"cf",
	"cg",
	"ch",
	"chat",
	"ci",
	"citic",
	"city",
	"ck",
	"cl",
	"click",
	"club",
	"club.ren",
	"cm",
	"cn",
	"cn.com",
	"cn.net",
	"co",
	"co.ao",
	"co.id",
	"co.il",
	"co.jp",
	"co.kr",
	"co.nz",
	"co.th",
	"co.uk",
	"co.za",
	"col",
	"college",
	"com",
	"com.au",
	"com.bo",
	"com.br",
	"com.cn",
	"com.co",
	"com.de",
	"com.do",
	"com.ec",
	"com.eg",
	"com.hk",
	"com.mo",
	"com.my",
	"com.nz",
	"com.ph",
	"com.py",
	"com.ru",
	"com.sa",
	"com.sc",
	"com.sg",
	"com.tw",
	"com.vn",
	"company",
	"coo",
	"cool",
	"coop",
	"cq.cn",
	"cr",
	"cricket",
	"cu",
	"cv",
	"cx",
	"cy",
	"cz",
	"date",
	"de",
	"design",
	"dev",
	"diet",
	"dj",
	"dk",
	"dm",
	"do",
	"dog",
	"domains",
	"download",
	"dz",
	"ec",
	"edu",
	"edu.cn",
	"edu.hk",
	"edu.mo",
	"ee",
	"eg",
	"email",
	"engineer",
	"er",
	"es",
	"et",
	"eu",
	"expert",
	"faith",
	"fans",
	"fi",
	"fish",
	"fj",
	"fj.cn",
	"fk",
	"flowers",
	"fm",
	"fo",
	"fr",
	"fyi",
	"ga",
	"gb",
	"gd",
	"gd.cn",
	"ge",
	"gf",
	"gg",
	"gh",
	"gi",
	"gift",
	"gives",
	"gl",
	"gm",
	"gn",
	"gold",
	"gov",
	"gov.cn",
	"gp",
	"gq",
	"gr",
	"gs",
	"gs.cn",
	"gt",
	"gu",
	"guru",
	"gw",
	"gx.cn",
	"gy",
	"gz.cn",
	"ha.cn",
	"haus",
	"hb.cn",
	"he.cn",
	"help",
	"hi.cn",
	"hk",
	"hk.cn",
	"hl.cn",
	"hm",
	"hn",
	"hn.cn",
	"holiday",
	"host",
	"hosting",
	"house",
	"hr",
	"ht",
	"hu",
	"id",
	"ie",
	"il",
	"im",
	"in",
	"info",
	"ink",
	"int",
	"international",
	"io",
	"iq",
	"ir",
	"is",
	"it",
	"je",
	"jl.cn",
	"jm",
	"jo",
	"jobs",
	"jp",
	"js.cn",
	"jx.cn",
	"ke",
	"kg",
	"kh",
	"khb.ru",
	"ki",
	"kim",
	"km",
	"kn",
	"kp",
	"kr",
	"kr.com",
	"kw",
	"ky",
	"kz",
	"la",
	"lab",
	"land",
	"lawyer",
	"lb",
	"lc",
	"li",
	"life",
	"link",
	"live",
	"lk",
	"ln.cn",
	"loan",
	"lol",
	"love",
	"lr",
	"ls",
	"lt",
	"lu",
	"lv",
	"ly",
	"ma",
	"market",
	"marketing",
	"mc",
	"md",
	"me",
	"media",
	"men",
	"mg",
	"mh",
	"mil",
	"mil.cn",
	"mk",
	"ml",
	"mm",
	"mn",
	"mo",
	"mo.cn",
	"mobi",
	"moe",
	"money",
	"moscow",
	"mp",
	"mq",
	"mr",
	"ms",
	"mt",
	"mu",
	"museum",
	"mv",
	"mw",
	"mx",
	"my",
	"mz",
	"na",
	"name",
	"nc",
	"ne",
	"net",
	"net.au",
	"net.cn",
	"net.ru",
	"net.tw",
	"news",
	"nf",
	"ng",
	"ni",
	"ninja",
	"nl",
	"nm.cn",
	"no",
	"np",
	"nr",
	"nu",
	"nx.cn",
	"nz",
	"om",
	"one",
	"onion",
	"online",
	"ooo",
	"or.id",
	"org",
	"org.au",
	"org.cn",
	"org.pg",
	"org.ru",
	"org.uk",
	"pa",
	"party",
	"pe",
	"pf",
	"pg",
	"ph",
	"photo",
	"photography",
	"photos",
	"pics",
	"pink",
	"pk",
	"pl",
	"plus",
	"pm",
	"pn",
	"pr",
	"press",
	"pro",
	"ps",
	"pt",
	"pub",
	"pw",
	"py",
	"qa",
	"qh.cn",
	"racing",
	"re",
	"red",
	"ren",
	"rent",
	"review",
	"rip",
	"ro",
	"rocks",
	"rs",
	"ru",
	"run",
	"rw",
	"sa",
	"sale",
	"sb",
	"sc",
	"sc.cn",
	"school",
	"science",
	"sd",
	"sd.cn",
	"se",
	"services",
	"sex",
	"sexy",
	"sg",
	"sh",
	"sh.cn",
	"show",
	"si",
	"site",
	"sj",
	"sk",
	"sl",
	"sm",
	"sn",
	"sn.cn",
	"so",
	"social",
	"software",
	"sohu",
	"solutions",
	"space",
	"sr",
	"st",
	"studio",
	"style",
	"su",
	"support",
	"sv",
	"sx.cn",
	"sy",
	"sz",
	"taipei",
	"tax",
	"tc",
	"td",
	"team",
	"tech",
	"tel",
	"tf",
	"tg",
	"th",
	"tips",
	"tj",
	"tj.cn",
	"tk",
	"tl",
	"tm",
	"tn",
	"to",
	"today",
	"tools",
	"top",
	"town",
	"toys",
	"tp",
	"tr",
	"trade",
	"travel",
	"tt",
	"tv",
	"tw",
	"tw.cn",
	"tz",
	"ua",
	"ug",
	"uk",
	"us",
	"uy",
	"uz",
	"va",
	"vc",
	"ve",
	"vet",
	"vg",
	"vi",
	"video",
	"vn",
	"vu",
	"wang",
	"watch",
	"webcam",
	"website",
	"wf",
	"wiki",
	"win",
	"work",
	"works",
	"world",
	"ws",
	"wtf",
	"xin",
	"xj.cn",
	"xn—czru2d",
	"xyz",
	"xz.cn",
	"ye",
	"yn.cn",
	"yt",
	"za",
	"zj.cn",
	"zm",
	"zone",
	"zw",
	"中信",
	"中国",
	"中國",
	"中文网",
	"公司",
	"公司.cn",
	"公司.hk",
	"公司.香港",
	"公益",
	"公益.cn",
	"公益.中国",
	"公益.中國",
	"其它",
	"其它.cn",
	"商城",
	"商标",
	"在线",
	"我爱你",
	"政务",
	"政务.cn",
	"政务.中国",
	"政务.中國",
	"政務",
	"政務.cn",
	"政務.中国",
	"政務.中國",
	"移动",
	"網絡",
	"網絡.cn",
	"网址",
	"网络",
	"网络.cn",
	"集团",
	"香港",
	"beta",
	"vip",
	"crop",
	"cnpc",
	"ovh",
	"futbol",
	"com.tr",
}

func InArray[T comparable](item T, arrayData []T) bool {
	dataLen := len(arrayData)
	if dataLen == 0 {
		return false
	}
	for i := 0; i < dataLen; i++ {
		if item == arrayData[i] {
			return true
		}
	}
	return false
}

func RootDomain(in string) (string, error) {
	if !strings.Contains(in, ".") {
		return "", fmt.Errorf("no vail domain")
	}
	ss := strings.Split(in, ".")
	sl := len(ss)
	if sl < 2 {
		return "", fmt.Errorf("no vail domain")
	}

	if InArray(fmt.Sprintf("%v.%v", ss[sl-2], ss[sl-1]), suffix) {
		return fmt.Sprintf("%v.%v.%v", ss[sl-3], ss[sl-2], ss[sl-1]), nil
	}

	if InArray(ss[sl-1], suffix) {
		return fmt.Sprintf("%v.%v", ss[sl-2], ss[sl-1]), nil
	}

	return "", fmt.Errorf("no vail domain.")
}
